#include "constantes.h"
#include "editeur.h"

void editer(SDL_Surface *ecran)
{
    SDL_Surface *mario=NULL, *caisse[2]={NULL}, *mur=NULL, *objectif=NULL, *instructions=NULL;
    SDL_Rect pmario, pinstructions, pobjet, pcurseur;
    SDL_Rect *ptrpmario=&pmario;
    SDL_Event event;
    int map[WTILES][HTILES]={{0}}, continuer=1, typeObjet=1, i, j, k, hold=0, marioOk=0, passer=1;
    // ------- typeObjet : 1:Mur, 2:Caisse, 3:Objectif, 4:Mario, 5:Caisse OK
    int *ptrmarioOk=&marioOk;
    mario=IMG_Load("GFX/mario_bas.gif");
    caisse[0]=IMG_Load("GFX/caisse.png");
    caisse[1]=IMG_Load("GFX/caisse_ok.png");
    mur=IMG_Load("GFX/mur.png");
    objectif=IMG_Load("GFX/objectif.png");
    SDL_SetColorKey(objectif,SDL_SRCCOLORKEY,SDL_MapRGB(objectif->format,255,0,255));
    instructions=IMG_Load("GFX/instructions.png");

    pinstructions.x=0;
    pinstructions.y=0;
    /* ---- Boucle qui affiche le mode d'emploi de l'éditeur ---- */
    while(passer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                passer=0;
                continuer=0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_SPACE:
                        passer=0;
                        break;
                    case SDLK_RETURN:
                        passer=0;
                        break;
                    case SDLK_ESCAPE:
                        passer=0;
                        continuer=0;
                        break;
                }
        }
        SDL_BlitSurface(instructions,NULL,ecran,&pinstructions);
        SDL_Flip(ecran);
    }

    SDL_FreeSurface(instructions);

    SDL_WarpMouse(TFENETRE / 2, TFENETRE / 2); // La souris est mise au milieu de la fenêtre
    SDL_ShowCursor(SDL_DISABLE); // On va dessiner l'objet sélectionné à la place du curseur

    while(continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_QUIT:
                continuer=0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                    case SDLK_ESCAPE:
                        continuer=0;
                        break;
                    case SDLK_UP:
                        if (typeObjet == 5)
                            typeObjet=1;
                        else
                            typeObjet++;
                        break;
                    case SDLK_DOWN:
                        if (typeObjet == 1)
                            typeObjet=5;
                        else
                            typeObjet--;
                        break;
                    case SDLK_s:
                        sauvegarderNiveau(map,ecran);
                        break;
                    case SDLK_l:
                        recupererNiveau(map);
                        break;
                }
                break;
            case SDL_MOUSEBUTTONDOWN:
                switch(event.button.button)
                {
                    case SDL_BUTTON_LEFT:
                        poserObjet(pcurseur,map,typeObjet,ptrmarioOk,ptrpmario);
                        hold=1; // On maintient le clic gauche
                        break;
                    case SDL_BUTTON_RIGHT:
                        enleverObjet(pcurseur,map,ptrmarioOk);
                        hold=2; // On maintient le clic droit
                        break;
                    case SDL_BUTTON_WHEELUP:
                        if (typeObjet == 5)
                            typeObjet=1;
                        else
                            typeObjet++;
                        break;
                    case SDL_BUTTON_WHEELDOWN:
                        if (typeObjet == 1)
                            typeObjet=5;
                        else
                            typeObjet--;
                        break;
                }
                break;
                case SDL_MOUSEBUTTONUP:
                    switch(event.button.button)
                    {
                        case SDL_BUTTON_RIGHT:
                            hold=0;
                            break;
                        case SDL_BUTTON_LEFT:
                            hold=0;
                            break;
                    }
                    break;
            case SDL_MOUSEMOTION:
                pcurseur.x=event.motion.x-(TILE_SIZE/2);
                pcurseur.y=event.motion.y-(TILE_SIZE/2);
                if(hold == 1 && typeObjet != 4)
                    poserObjet(pcurseur,map,typeObjet,ptrmarioOk,ptrpmario);
                else if(hold == 2)
                    enleverObjet(pcurseur,map,ptrmarioOk);
                break;
        }
        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));
        for(i=0;i<WTILES;i++)
        {
            for(j=0;j<HTILES;j++)
            {
                pobjet.x=i*TILE_SIZE;
                pobjet.y=j*TILE_SIZE;
                switch(map[i][j])
                {
                    case 1:
                        SDL_BlitSurface(mur,NULL,ecran,&pobjet);
                        break;
                    case 2:
                        SDL_BlitSurface(caisse[0],NULL,ecran,&pobjet);
                        break;
                    case 3:
                        SDL_BlitSurface(objectif,NULL,ecran,&pobjet);
                        break;
                    case 4:
                        SDL_BlitSurface(mario,NULL,ecran,&pobjet);
                        marioOk=1;
                        pmario=pobjet;
                        break;
                    case 5:
                        SDL_BlitSurface(caisse[1],NULL,ecran,&pobjet);
                        break;
                }
            }
        }
        switch(typeObjet)
        {
            case 1:
                SDL_BlitSurface(mur,NULL,ecran,&pcurseur);
                break;
            case 2:
                SDL_BlitSurface(caisse[0],NULL,ecran,&pcurseur);
                break;
            case 3:
                SDL_BlitSurface(objectif,NULL,ecran,&pcurseur);
                break;
            case 4:
                SDL_BlitSurface(mario,NULL,ecran,&pcurseur);
                break;
            case 5:
                SDL_BlitSurface(caisse[1],NULL,ecran,&pcurseur);
                break;
        }
        SDL_Flip(ecran);
    }
    SDL_FreeSurface(mur);
    SDL_FreeSurface(objectif);
    for(k=0;k<2;k++)
        SDL_FreeSurface(caisse[k]);
    SDL_FreeSurface(mario);
}
